From 50420def5b121d549a3638cb9e7a925eb20493e5 Mon Sep 17 00:00:00 2001 From: Ewan Mellor Date: Tue, 21 Nov 2006 10:22:19 +0000 Subject: [PATCH] This is a refactored version of a previous patch that destroys external devices' state when a VM configuration file is destroyed. Currently only the vTPM device's state needs to be explicitly destroyed. I am also surrounding the saving of the managed domain's configuration with a try-catch. Signed-off-by: Stefan Berger --- tools/python/xen/xend/XendAPI.py | 9 ++++++--- tools/python/xen/xend/XendConstants.py | 6 ++++++ tools/python/xen/xend/XendDevices.py | 10 ++++++++++ tools/python/xen/xend/XendDomain.py | 3 ++- tools/python/xen/xend/server/tpmif.py | 8 ++++++-- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/tools/python/xen/xend/XendAPI.py b/tools/python/xen/xend/XendAPI.py index fba16a812f..9ac9996d79 100644 --- a/tools/python/xen/xend/XendAPI.py +++ b/tools/python/xen/xend/XendAPI.py @@ -1391,9 +1391,12 @@ class XendAPI: xendom = XendDomain.instance() if xendom.is_valid_vm(vtpm_struct['VM']): dom = xendom.get_vm_by_uuid(vtpm_struct['VM']) - vtpm_ref = dom.create_vtpm(vtpm_struct) - xendom.managed_config_save(dom) - return xen_api_success(vtpm_ref) + try: + vtpm_ref = dom.create_vtpm(vtpm_struct) + xendom.managed_config_save(dom) + return xen_api_success(vtpm_ref) + except XendError: + return xen_api_error(XEND_ERROR_TODO) else: return xen_api_error(XEND_ERROR_DOMAIN_INVALID) diff --git a/tools/python/xen/xend/XendConstants.py b/tools/python/xen/xend/XendConstants.py index d956c2fe4a..96f7a22d7e 100644 --- a/tools/python/xen/xend/XendConstants.py +++ b/tools/python/xen/xend/XendConstants.py @@ -88,6 +88,12 @@ DEV_MIGRATE_STEP1 = 1 DEV_MIGRATE_STEP2 = 2 DEV_MIGRATE_STEP3 = 3 +# +# VTPM-related constants +# + +VTPM_DELETE_SCRIPT = '/etc/xen/scripts/vtpm-delete' + # # Xenstore Constants # diff --git a/tools/python/xen/xend/XendDevices.py b/tools/python/xen/xend/XendDevices.py index 2286824087..ce91e28271 100644 --- a/tools/python/xen/xend/XendDevices.py +++ b/tools/python/xen/xend/XendDevices.py @@ -71,3 +71,13 @@ class XendDevices: make_controller = classmethod(make_controller) + def destroy_device_state(cls, domain): + """Destroy the state of (external) devices. This is necessary + to do when a VM's configuration is destroyed. + + @param domain: domain this controller is handling devices for. + @type domain: XendDomainInfo + """ + tpmif.destroy_vtpmstate(domain.getName()) + + destroy_device_state = classmethod(destroy_device_state) diff --git a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py index 0bf1b63a37..c32ec29390 100644 --- a/tools/python/xen/xend/XendDomain.py +++ b/tools/python/xen/xend/XendDomain.py @@ -37,6 +37,7 @@ from xen.xend.XendError import XendError, XendInvalidDomain, VmError from xen.xend.XendLogging import log from xen.xend.XendConstants import XS_VMROOT from xen.xend.XendConstants import DOM_STATE_HALTED, DOM_STATE_RUNNING +from xen.xend.XendDevices import XendDevices from xen.xend.xenstore.xstransact import xstransact from xen.xend.xenstore.xswatch import xswatch @@ -898,7 +899,7 @@ class XendDomain: self._managed_domain_unregister(dominfo) self._remove_domain(dominfo) - + XendDevices.destroy_device_state(dominfo) except Exception, ex: raise XendError(str(ex)) finally: diff --git a/tools/python/xen/xend/server/tpmif.py b/tools/python/xen/xend/server/tpmif.py index c313efe2a8..494a197b8e 100644 --- a/tools/python/xen/xend/server/tpmif.py +++ b/tools/python/xen/xend/server/tpmif.py @@ -25,7 +25,7 @@ from xen.xend import sxp from xen.xend import XendRoot from xen.xend.XendLogging import log from xen.xend.XendError import XendError -from xen.xend.XendConstants import DEV_MIGRATE_TEST +from xen.xend.XendConstants import DEV_MIGRATE_TEST, VTPM_DELETE_SCRIPT from xen.xend.server.DevController import DevController import os @@ -33,6 +33,10 @@ import re xroot = XendRoot.instance() +def destroy_vtpmstate(name): + if os.path.exists(VTPM_DELETE_SCRIPT): + os.system(VTPM_DELETE_SCRIPT + " " + name) + class TPMifController(DevController): """TPM interface controller. Handles all TPM devices for a domain. """ @@ -79,7 +83,7 @@ class TPMifController(DevController): if uuid: result['uuid'] = uuid if type: - result['type'] == type + result['type'] = type return result -- 2.30.2